package com.bjc.chapter05;

/**
 * 方法中定义的局部变量表是否线程安全？ 具体问题具体分析
 *
 * 何为线程安全？
 *  如果只有一个线程才可以以操作此数据，则必是线程安全的。
 *  如果有多个线程操作此数据，则此数据是共享数据，如果不考虑同步机制的话，会存在线程安全问题
 */
public class StringBuilderTest {

    //这里s1是线程安全的
    public static void method1(){
        //StringBuilder：线程不安全
        StringBuilder s1 = new StringBuilder();
        s1.append("a");
        s1.append("b");
        //....
    }

    //这里的builder是线程不安全的
    public static void method2(StringBuilder builder){
        builder.append("a");
        builder.append("b");
        //...
    }

    //s1的操作是线程不安全的 返回值可能被其他线程给调用了
    public static StringBuilder method3(){
        StringBuilder s1 = new StringBuilder();
        s1.append("a");
        s1.append("b");
        return s1;
    }

    //s1的操作是线程安全的  因为这里返回结果后 s1消亡了  只针对s1  返回结果可能还是不安全的
    public static String method4(){
        StringBuilder s1 = new StringBuilder();
        s1.append("a");
        s1.append("b");
        return s1.toString();
    }

    /**
     * 总结  局部变量表的数据是内部产生内部消亡的就是安全的  如果不是 或者将其作为返回值就是不安全的
     * @param args
     */

    public static void main(String[] args) {
        StringBuilder s = new StringBuilder();

        new Thread(()->{
            s.append("a");
            s.append("b");
        }).start();

        method2(s);
    }
}
